from llm import llm

prompt = """
你需要从给定的答案中提取`纯答案`部分，并按照以下规则处理：

### `纯答案`定义：
- 只保留直接回答问题所需的核心数据或信息，去除所有解释、分析、思路、代码或额外说明。
- 如果答案是数值型，保留问题要求的精度（如两位小数、四位小数等）。
- 如果答案是名称型，根据问题要求选择公司全称、简称或代码；若无明确要求，则保留答案中提供的所有名称类型。
- 如果答案是日期型，保留问题要求的格式（如 YYYY-MM-DD 或 YYYY年MM月DD日）。

### 处理规则：
1. 提取所有答案：
   - 从提供的多个答案中提取所有`纯答案`，包括重复值。
   - 忽略任何非答案内容，如“任务完成”、“思路”、“代码块”或其他标记。
   - 去掉所有题目描述，仅仅保留答案部分。

2. 去重与排序：
   - 去除完全相同的重复答案（大小写、符号、数值精度一致）。
   - 如果答案是数值型且精度不同（如 2.37 和 2.3700），视为不同答案保留。
   - 不改变答案的原有符号或格式，除非问题明确要求调整。

3. 多答案格式：
   - 如果提取后有多个不同答案，用分号（;）分隔。
   - 不添加多余空格或符号，确保紧凑格式。

4. 特殊情况：
   - 如果答案中包含单位（如元、股、%），保留单位，除非问题要求剔除。
   - 如果答案是列表（如多个公司名称），以分号分隔每个条目。
   - 如果答案明确表示“无数据”或“未找到”，视为 `0个`,`无`,`否`等回答。

5. 完整性：
   - 提取的答案必须完整，要求问题所有的答案都要提取。
   - 如果不明确提取目标，尽可能多提取。
   - 多个答案请不要怀疑正确性，都要提取。
   - 对于公司名称，如果有说明，则仅提取说明部分，无明确说明，为：全称(简称)形式

### 示例：
问题： GLYY中文全称是什么？（答案需回答公司全称）  
答案： 任务完成\n【答案: 甘李药业股份有限公司（甘李药业）】  
提取结果： 甘李药业股份有限公司  


问题： 2021年末，该股票的A股流通市值占一级行业流通市值百分之多少？（答案需要包含2位小数）  
答案： 任务完成\n【答案: 37.29%】\n任务完成\n【答案: 2.37%】\n\n任务完成\n【答案: 2.37%】\n任务完成\n【答案: 1.96%】\n任务完成\n【答案: 15.74%】  
提取结果： 37.29%;1.96%;15.74%  


问题： 该公司当年单日最高涨幅有多少？（答案需要包含两位小数）  
答案： 任务完成\n【答案: 3.68】\n任务完成\n【答案: 7.24】\n任务完成\n【答案: 7.24】  
提取结果： 3.68;7.24  

### 当前任务：
当前问题：```{}```
待处理答案：
---
{}
---
以上日志为要提取的答案。
提取结果："""

import json
from concurrent.futures import ThreadPoolExecutor, as_completed

def process_answer(j, prompt):
    try:
        if j['answer_for_summary'] != '':
            j['answer'] += ';'
            j['answer'] += llm(prompt.format(j['question'], j['answer_for_summary']))
            j['answer'] = ';'.join([i for i in set(j['answer'].split(';')) if i!=''])
        del j['answer_for_summary']
    except Exception as e:
        print(f"Error processing answer: {e}")
    return j

def rewriter(answer_path):
    with open(answer_path, 'r', encoding='utf8') as load_f:
        data = json.load(load_f)

    with ThreadPoolExecutor(max_workers=30) as executor:
        futures = []
        for i in data:
            for j in i['team']:
                futures.append(executor.submit(process_answer, j, prompt))

        for future in as_completed(futures):
            try:
                result = future.result()
            except Exception as e:
                print(f"Thread generated an exception: {e}")

    with open(answer_path, 'w', encoding='utf-8') as json_file:
        json.dump(data, json_file, ensure_ascii=False, indent=4)
